{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<img src=\"http://hilpisch.com/tpq_logo.png\" alt=\"The Python Quants\" width=\"35%\" align=\"right\" border=\"0\"><br>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Python for Finance"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Analyze Big Financial Data**\n",
    "\n",
    "O'Reilly (2014)\n",
    "\n",
    "Yves Hilpisch"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<img style=\"border:0px solid grey;\" src=\"http://hilpisch.com/python_for_finance.png\" alt=\"Python for Finance\" width=\"30%\" align=\"left\" border=\"0\">"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Buy the book ** |\n",
    "<a href='http://shop.oreilly.com/product/0636920032441.do' target='_blank'>O'Reilly</a> |\n",
    "<a href='http://www.amazon.com/Yves-Hilpisch/e/B00JCYHHJM' target='_blank'>Amazon</a>\n",
    "\n",
    "**All book codes & IPYNBs** |\n",
    "<a href=\"http://oreilly.quant-platform.com\">http://oreilly.quant-platform.com</a>\n",
    "\n",
    "**The Python Quants GmbH** | <a href='http://tpq.io' target='_blank'>http://tpq.io</a>\n",
    "\n",
    "**Contact us** | <a href='mailto:pff@tpq.io'>pff@tpq.io</a>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Input-Output Operations"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from pylab import plt\n",
    "plt.style.use('seaborn')\n",
    "import matplotlib as mpl\n",
    "mpl.rcParams['font.family'] = 'serif'"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Basic I/O with Python"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Writing Objects to Disk"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "uuid": "d5bf9798-386b-49b8-a703-36263d9d75d4"
   },
   "outputs": [],
   "source": [
    "path = '/Users/yves/Documents/Temp/data/'  # choose a path to your liking"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "uuid": "c2722e94-01ea-4f98-804f-56fe1b666770"
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "from random import gauss"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "uuid": "7d03b06c-a907-4a16-913f-e6a8f9a05d51"
   },
   "outputs": [],
   "source": [
    "a = [gauss(1.5, 2) for i in range(1000000)]\n",
    "  # generation of normally distributed randoms"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "uuid": "39126a87-5a20-4090-b805-b6b1eb634952"
   },
   "outputs": [],
   "source": [
    "import pickle"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "uuid": "4aa88b7c-3155-4311-9afc-564bf3b06225"
   },
   "outputs": [],
   "source": [
    "pkl_file = open(path + 'data.pkl', 'wb')\n",
    "  # open file for writing\n",
    "  # Note: existing file might be overwritten"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "uuid": "e2611db7-97ed-4162-9cc5-127c7cd89cbd"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 31.7 ms, sys: 14.8 ms, total: 46.5 ms\n",
      "Wall time: 47 ms\n"
     ]
    }
   ],
   "source": [
    "%time pickle.dump(a, pkl_file)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "uuid": "1671d5b6-04cd-42ed-b7dd-ca3001521379"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<_io.BufferedWriter name='/Users/yves/Documents/Temp/data/data.pkl'>"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pkl_file"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "uuid": "f2b0c608-c399-401b-b8fa-d44d8eca54b8"
   },
   "outputs": [],
   "source": [
    "pkl_file.close()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "uuid": "f401db99-56f3-49a5-9c75-772fe5d00d07"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-rw-r--r--  1 yves  staff  9002006 Nov 18 11:18 /Users/yves/Documents/Temp/data/data.pkl\r\n",
      "-rw-r--r--  1 yves  staff     1024 Nov 18 11:18 /Users/yves/Documents/Temp/data/tab.h5\r\n"
     ]
    }
   ],
   "source": [
    "ll $path*"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "uuid": "8c9bd301-e980-4eb5-9021-4fde182f5eb7"
   },
   "outputs": [],
   "source": [
    "pkl_file = open(path + 'data.pkl', 'rb')  # open file for reading"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "uuid": "6c8c4ae7-1ece-4b7c-87bc-8457da4798b2"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 41.7 ms, sys: 21.8 ms, total: 63.5 ms\n",
      "Wall time: 65.3 ms\n"
     ]
    }
   ],
   "source": [
    "%time b = pickle.load(pkl_file)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "uuid": "8bf2e00b-fa06-4524-aa51-6b295fabad00"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[0.41705297184667334,\n",
       " 1.9019740570376804,\n",
       " 1.168316084750203,\n",
       " 3.076797110090128,\n",
       " 1.53114300797927]"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "b[:5]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "uuid": "253951a8-ecec-4fdf-a502-86cfa1d1186d"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[0.41705297184667334,\n",
       " 1.9019740570376804,\n",
       " 1.168316084750203,\n",
       " 3.076797110090128,\n",
       " 1.53114300797927]"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a[:5]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "uuid": "90b9f136-8195-4f32-9907-1b88469ae55e"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.allclose(np.array(a), np.array(b))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "uuid": "066a1d61-c385-48e7-9690-fecc23e5eaf3"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.0"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.sum(np.array(a) - np.array(b))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "uuid": "7a6b9460-b5ac-4ab5-b083-9912f9dfcef8"
   },
   "outputs": [],
   "source": [
    "pkl_file = open(path + 'data.pkl', 'wb')  # open file for writing"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "uuid": "bd6b8e9a-d093-4f98-b88c-27aef388957b"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 33 ms, sys: 11.4 ms, total: 44.4 ms\n",
      "Wall time: 43.9 ms\n"
     ]
    }
   ],
   "source": [
    "%time pickle.dump(np.array(a), pkl_file)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "uuid": "d517f9d6-8176-424c-89ef-0c892f9fd61c"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 33.6 ms, sys: 11.1 ms, total: 44.7 ms\n",
      "Wall time: 44.9 ms\n"
     ]
    }
   ],
   "source": [
    "%time pickle.dump(np.array(a) ** 2, pkl_file)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "uuid": "5f558934-6f53-472e-9040-a5c96ee1718d"
   },
   "outputs": [],
   "source": [
    "pkl_file.close()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "uuid": "b129b0ae-6bcc-4946-817a-ff01c155eacb"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-rw-r--r--  1 yves  staff  16000322 Nov 18 11:18 /Users/yves/Documents/Temp/data/data.pkl\r\n",
      "-rw-r--r--  1 yves  staff      1024 Nov 18 11:18 /Users/yves/Documents/Temp/data/tab.h5\r\n"
     ]
    }
   ],
   "source": [
    "ll $path*"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "uuid": "59d5dceb-8779-46ff-b2ae-c2e43a7d2c10"
   },
   "outputs": [],
   "source": [
    "pkl_file = open(path + 'data.pkl', 'rb')  # open file for reading"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "uuid": "0f981d7b-0a68-412d-bb9b-a377524e0f2c"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 0.41705297,  1.90197406,  1.16831608, ...,  1.19136073,\n",
       "       -2.3441016 ,  1.79922934])"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x = pickle.load(pkl_file)\n",
    "x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "uuid": "1a9cb2b5-a180-43f3-b2ed-20de3148b8a6"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 0.17393318,  3.61750531,  1.36496247, ...,  1.41934039,\n",
       "        5.49481231,  3.23722622])"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y = pickle.load(pkl_file)\n",
    "y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "uuid": "6beb0285-c53c-4f56-ac42-62000ef75257"
   },
   "outputs": [],
   "source": [
    "pkl_file.close()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "uuid": "df469b3f-55c4-43e8-a01d-f850f2153871"
   },
   "outputs": [],
   "source": [
    "pkl_file = open(path + 'data.pkl', 'wb')  # open file for writing\n",
    "pickle.dump({'x' : x, 'y' : y}, pkl_file)\n",
    "pkl_file.close()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "uuid": "e6f0219a-ceb4-481d-b033-065e122493c8"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "x [ 0.41705297  1.90197406  1.16831608  3.07679711]\n",
      "y [ 0.17393318  3.61750531  1.36496247  9.46668046]\n"
     ]
    }
   ],
   "source": [
    "pkl_file = open(path + 'data.pkl', 'rb')  # open file for writing\n",
    "data = pickle.load(pkl_file)\n",
    "pkl_file.close()\n",
    "for key in data.keys():\n",
    "    print(key, data[key][:4])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "uuid": "dc3181d1-7c8c-4960-8a9a-8a4d64c58a3f"
   },
   "outputs": [],
   "source": [
    "!rm -f $path*"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Reading and Writing Text Files"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "uuid": "5124219c-e041-4b36-af62-03faea5c0df1"
   },
   "outputs": [],
   "source": [
    "rows = 5000\n",
    "a = np.random.standard_normal((rows, 5))  # dummy data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "uuid": "5942c6e2-877a-4c0c-acca-11390e9a02f5"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-1.3943,  1.0583, -0.0957,  0.2299,  1.1435],\n",
       "       [-0.2705,  1.187 ,  0.3749, -0.1222,  0.4414],\n",
       "       [-1.2177,  1.9297,  0.5987, -1.38  ,  0.3748],\n",
       "       ..., \n",
       "       [ 0.6643,  0.9493, -0.9072, -0.2658, -1.8787],\n",
       "       [ 0.4846,  1.377 ,  0.2034, -1.2119,  0.3271],\n",
       "       [-0.1203,  0.3872,  0.0779,  0.7924, -0.5599]])"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a.round(4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {
    "uuid": "32f5b082-2fcb-4090-80ba-174cc347e519"
   },
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "t = pd.date_range(start='2014/1/1', periods=rows, freq='H')\n",
    "    # set of hourly datetime objects"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "uuid": "d52b1a47-3bca-4870-9829-1aef62f0952a"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "DatetimeIndex(['2014-01-01 00:00:00', '2014-01-01 01:00:00',\n",
       "               '2014-01-01 02:00:00', '2014-01-01 03:00:00',\n",
       "               '2014-01-01 04:00:00', '2014-01-01 05:00:00',\n",
       "               '2014-01-01 06:00:00', '2014-01-01 07:00:00',\n",
       "               '2014-01-01 08:00:00', '2014-01-01 09:00:00',\n",
       "               ...\n",
       "               '2014-07-27 22:00:00', '2014-07-27 23:00:00',\n",
       "               '2014-07-28 00:00:00', '2014-07-28 01:00:00',\n",
       "               '2014-07-28 02:00:00', '2014-07-28 03:00:00',\n",
       "               '2014-07-28 04:00:00', '2014-07-28 05:00:00',\n",
       "               '2014-07-28 06:00:00', '2014-07-28 07:00:00'],\n",
       "              dtype='datetime64[ns]', length=5000, freq='H')"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "t"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {
    "uuid": "39075f54-64cb-42c2-9798-be6638636a15"
   },
   "outputs": [],
   "source": [
    "csv_file = open(path + 'data.csv', 'w')  # open file for writing"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {
    "uuid": "3804898d-dae7-4de0-b0a1-976cd8e43cb3"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "25"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "header = 'date,no1,no2,no3,no4,no5\\n'\n",
    "csv_file.write(header)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {
    "uuid": "00c96e45-bf91-42d8-b6c9-eb343ee537b7"
   },
   "outputs": [],
   "source": [
    "for t_, (no1, no2, no3, no4, no5) in zip(t, a):\n",
    "    s = '%s,%f,%f,%f,%f,%f\\n' % (t_, no1, no2, no3, no4, no5)\n",
    "    csv_file.write(s)\n",
    "csv_file.close()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {
    "uuid": "03523876-01c1-410f-aac5-55fcf8aa0604"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-rw-r--r--  1 yves  staff  337496 Nov 18 11:18 /Users/yves/Documents/Temp/data/data.csv\r\n"
     ]
    }
   ],
   "source": [
    "ll $path*"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {
    "uuid": "b290e5d3-8e56-4d53-acae-51accd08c4f7"
   },
   "outputs": [],
   "source": [
    "csv_file = open(path + 'data.csv', 'r')  # open file for reading"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {
    "uuid": "7b1242f5-5892-44bd-a305-addf9daff316"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "date,no1,no2,no3,no4,no5\n",
      "2014-01-01 00:00:00,-1.394315,1.058289,-0.095678,0.229927,1.143520\n",
      "2014-01-01 01:00:00,-0.270480,1.187046,0.374870,-0.122235,0.441432\n",
      "2014-01-01 02:00:00,-1.217690,1.929734,0.598703,-1.379972,0.374803\n",
      "2014-01-01 03:00:00,1.150287,0.801783,-0.816626,0.079250,2.028039\n"
     ]
    }
   ],
   "source": [
    "for i in range(5):\n",
    "    print(csv_file.readline(), end='')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {
    "uuid": "00148061-9d3a-4459-b8b8-63c98f14194b"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "date,no1,no2,no3,no4,no5\n",
      "2014-01-01 00:00:00,-1.394315,1.058289,-0.095678,0.229927,1.143520\n",
      "2014-01-01 01:00:00,-0.270480,1.187046,0.374870,-0.122235,0.441432\n",
      "2014-01-01 02:00:00,-1.217690,1.929734,0.598703,-1.379972,0.374803\n",
      "2014-01-01 03:00:00,1.150287,0.801783,-0.816626,0.079250,2.028039\n"
     ]
    }
   ],
   "source": [
    "csv_file = open(path + 'data.csv', 'r')\n",
    "content = csv_file.readlines()\n",
    "for line in content[:5]:\n",
    "    print(line, end='')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {
    "uuid": "2b2384ca-8927-49e1-8070-33ef0c21a1a9"
   },
   "outputs": [],
   "source": [
    "csv_file.close()\n",
    "!rm -f $path*"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### SQL Databases"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {
    "uuid": "39c9650b-0430-4e66-b461-faecdb511537"
   },
   "outputs": [],
   "source": [
    "import sqlite3 as sq3"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {
    "uuid": "9e163352-767b-4888-a286-9a79265bb19b"
   },
   "outputs": [],
   "source": [
    "query = 'CREATE TABLE numbs (Date date, No1 real, No2 real)'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {
    "uuid": "cc01fd41-a6c6-426b-b235-42c903ff6c00"
   },
   "outputs": [],
   "source": [
    "con = sq3.connect(path + 'numbs.db')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {
    "uuid": "d97dad1a-10cc-43c0-a04a-a5da9b98396b"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<sqlite3.Cursor at 0x105ed3a40>"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "con.execute(query)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {
    "uuid": "cc2e7d31-8239-48b0-b032-f11a514d9349"
   },
   "outputs": [],
   "source": [
    "con.commit()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {
    "uuid": "6d76f99f-f6bb-4aad-b386-06946366bbe6"
   },
   "outputs": [],
   "source": [
    "import datetime as dt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {
    "uuid": "a37b7780-d824-4558-b12e-9e5dec6b3056"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<sqlite3.Cursor at 0x105ed3c70>"
      ]
     },
     "execution_count": 47,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "con.execute('INSERT INTO numbs VALUES(?, ?, ?)',\n",
    "            (dt.datetime.now(), 0.12, 7.3))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {
    "uuid": "5d882442-b6fb-4788-81b8-9f7814a352ae"
   },
   "outputs": [],
   "source": [
    "data = np.random.standard_normal((10000, 2)).round(5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {
    "uuid": "58b51e61-ed1a-4c5e-999a-0f55072e5d32"
   },
   "outputs": [],
   "source": [
    "for row in data:\n",
    "    con.execute('INSERT INTO numbs VALUES(?, ?, ?)',\n",
    "                (dt.datetime.now(), row[0], row[1]))\n",
    "con.commit()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {
    "uuid": "667cbd3a-e001-4548-8679-10aec0d31354"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[('2017-11-18 11:18:51.443295', 0.12, 7.3),\n",
       " ('2017-11-18 11:18:51.466328', 0.9791, -0.01914),\n",
       " ('2017-11-18 11:18:51.466580', -0.88736, 0.19104),\n",
       " ('2017-11-18 11:18:51.466700', 0.27877, 1.2128),\n",
       " ('2017-11-18 11:18:51.466739', 0.19375, -0.47101),\n",
       " ('2017-11-18 11:18:51.466760', -0.15771, 0.48576),\n",
       " ('2017-11-18 11:18:51.466778', 0.32436, -0.35469),\n",
       " ('2017-11-18 11:18:51.466799', -0.40715, 0.30432),\n",
       " ('2017-11-18 11:18:51.466817', 0.27333, 1.36148),\n",
       " ('2017-11-18 11:18:51.466837', -0.86928, 0.60982)]"
      ]
     },
     "execution_count": 50,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "con.execute('SELECT * FROM numbs').fetchmany(10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {
    "uuid": "c9217058-4cb9-49b9-b81b-a4c370fce834"
   },
   "outputs": [],
   "source": [
    "pointer = con.execute('SELECT * FROM numbs')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {
    "uuid": "7088d1c6-aed9-457a-a84a-58b1718ad164"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "('2017-11-18 11:18:51.443295', 0.12, 7.3)\n",
      "('2017-11-18 11:18:51.466328', 0.9791, -0.01914)\n",
      "('2017-11-18 11:18:51.466580', -0.88736, 0.19104)\n"
     ]
    }
   ],
   "source": [
    "for i in range(3):\n",
    "    print(pointer.fetchone())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {
    "uuid": "3f80d448-2ff3-4e07-80ce-d8971f367a2c"
   },
   "outputs": [],
   "source": [
    "con.close()\n",
    "!rm -f $path*"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Writing and Reading Numpy Arrays"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {
    "uuid": "55cb3a69-0ad9-41eb-9e4f-33ce8a87cf3c"
   },
   "outputs": [],
   "source": [
    "import numpy as np"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {
    "uuid": "4e65636e-de0f-49d1-bd67-b63868fb3a3a"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3681360"
      ]
     },
     "execution_count": 55,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dtimes = np.arange('2015-01-01 10:00:00', '2021-12-31 22:00:00',\n",
    "                  dtype='datetime64[m]')  # minute intervals\n",
    "len(dtimes)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {
    "uuid": "d5d873f2-4ffa-4fad-a802-9c12a9e30046"
   },
   "outputs": [],
   "source": [
    "dty = np.dtype([('Date', 'datetime64[m]'), ('No1', 'f'), ('No2', 'f')])\n",
    "data = np.zeros(len(dtimes), dtype=dty)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {
    "uuid": "d8cd7ec4-a323-44db-91ba-9a8a9edde1b4"
   },
   "outputs": [],
   "source": [
    "data['Date'] = dtimes"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {
    "uuid": "3f9e6dc3-23c8-46b2-b776-c5f73d22ce04"
   },
   "outputs": [],
   "source": [
    "a = np.random.standard_normal((len(dtimes), 2)).round(5)\n",
    "data['No1'] = a[:, 0]\n",
    "data['No2'] = a[:, 1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {
    "uuid": "d783e0e3-0238-49f0-b3cf-655012d25ff3"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 3.8 ms, sys: 90.2 ms, total: 94 ms\n",
      "Wall time: 100 ms\n"
     ]
    }
   ],
   "source": [
    "%time np.save(path + 'array', data)  # suffix .npy is added"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {
    "uuid": "329fb352-9724-4f9b-98e9-3d0d144c9cf9"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-rw-r--r--  1 yves  staff  58901888 Nov 18 11:18 /Users/yves/Documents/Temp/data/array.npy\r\n"
     ]
    }
   ],
   "source": [
    "ll $path*"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {
    "uuid": "b5f60285-80a3-4caa-b528-064b5302464b"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 1.98 ms, sys: 48.7 ms, total: 50.6 ms\n",
      "Wall time: 48.6 ms\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([('2015-01-01T10:00',  0.21562999,  0.15317   ),\n",
       "       ('2015-01-01T10:01', -1.05716002,  0.03817   ),\n",
       "       ('2015-01-01T10:02',  0.47112   ,  0.35991001), ...,\n",
       "       ('2021-12-31T21:57',  1.28573   , -0.73549998),\n",
       "       ('2021-12-31T21:58', -0.29818001,  3.01900005),\n",
       "       ('2021-12-31T21:59',  0.10222   , -0.32659999)],\n",
       "      dtype=[('Date', '<M8[m]'), ('No1', '<f4'), ('No2', '<f4')])"
      ]
     },
     "execution_count": 61,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%time np.load(path + 'array.npy')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {
    "uuid": "d10836fb-aa11-4fb9-8c2c-24d46f48b46b"
   },
   "outputs": [],
   "source": [
    "data = np.random.standard_normal((10000, 6000))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {
    "uuid": "2b48a768-2abb-46c1-9499-946e4e43f26e"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 22.4 ms, sys: 801 ms, total: 823 ms\n",
      "Wall time: 878 ms\n"
     ]
    }
   ],
   "source": [
    "%time np.save(path + 'array', data) "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {
    "uuid": "c0de71b2-0d43-4752-82e4-982cc40fc47a"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-rw-r--r--  1 yves  staff  480000080 Nov 18 11:18 /Users/yves/Documents/Temp/data/array.npy\r\n"
     ]
    }
   ],
   "source": [
    "ll $path*"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {
    "uuid": "3bedfde2-d212-40e6-a043-379e416fcc08"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 1.93 ms, sys: 402 ms, total: 404 ms\n",
      "Wall time: 401 ms\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([[ 0.03967231, -0.44617488,  1.84494039, ...,  1.22029866,\n",
       "         0.12221619,  0.44151821],\n",
       "       [-1.07434497,  1.56631898,  0.08090161, ...,  0.69134028,\n",
       "        -0.23983819, -1.05064435],\n",
       "       [ 0.45244652, -1.06725802, -1.54753357, ..., -0.58159932,\n",
       "        -3.1417449 ,  0.72427687],\n",
       "       ..., \n",
       "       [ 0.22671119,  0.84848976,  0.68443249, ...,  0.60887334,\n",
       "        -0.21399232,  0.98265078],\n",
       "       [ 1.29398576,  0.8073082 ,  1.12266816, ...,  0.27215982,\n",
       "        -1.70811003, -1.17700969],\n",
       "       [-1.34442515, -0.72330326, -0.19741916, ..., -0.2253629 ,\n",
       "         0.50730268,  1.44775108]])"
      ]
     },
     "execution_count": 65,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%time np.load(path + 'array.npy')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {
    "uuid": "b5de422d-014e-4f1f-b80c-4c1333920a57"
   },
   "outputs": [],
   "source": [
    "data = 0.0\n",
    "!rm -f $path*"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## I/O with pandas"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {
    "uuid": "e0ba11e0-7bdf-4e1f-b8a2-0566cb5ab7a7"
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "data = np.random.standard_normal((1000000, 5)).round(5)\n",
    "        # sample data set"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {
    "uuid": "366021ec-1265-4fef-ae96-b280c7f3cd2b"
   },
   "outputs": [],
   "source": [
    "filename = path + 'numbs'"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### SQL Database"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {
    "uuid": "ec2ee399-b7d1-4900-b9d8-f4e76492954e"
   },
   "outputs": [],
   "source": [
    "import sqlite3 as sq3"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "metadata": {
    "uuid": "296ae8af-8da3-4f6d-98bd-2816374d8526"
   },
   "outputs": [],
   "source": [
    "query = 'CREATE TABLE numbers (No1 real, No2 real,\\\n",
    "        No3 real, No4 real, No5 real)'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "metadata": {
    "uuid": "41eac653-cff4-4bab-b27a-18982f4b6159"
   },
   "outputs": [],
   "source": [
    "con = sq3.Connection(filename + '.db')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "metadata": {
    "uuid": "8c1f7339-7383-4716-b1dc-d18bdd651bfe"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<sqlite3.Cursor at 0x107b55030>"
      ]
     },
     "execution_count": 72,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "con.execute(query)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {
    "uuid": "c9bd1eba-510d-4b60-89bf-88dd90e96b4f"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 8.19 s, sys: 285 ms, total: 8.48 s\n",
      "Wall time: 9.2 s\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "con.executemany('INSERT INTO numbers VALUES (?, ?, ?, ?, ?)', data)\n",
    "con.commit()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "metadata": {
    "uuid": "f2331de4-877b-48fe-aac1-fd823af82b24"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-rw-r--r--  1 yves  staff  52633600 Nov 18 11:19 /Users/yves/Documents/Temp/data/numbs.db\r\n"
     ]
    }
   ],
   "source": [
    "ll $path*"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {
    "uuid": "36c34da0-f8d8-4bf5-8241-45266a118747"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[(0.81395, -1.14852, 1.25441, -0.20772, -0.76249), (-1.75186, -0.51531, 0.7186, 0.45964, -0.61147)]\n",
      "CPU times: user 1.74 s, sys: 160 ms, total: 1.9 s\n",
      "Wall time: 1.92 s\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "temp = con.execute('SELECT * FROM numbers').fetchall()\n",
    "print(temp[:2])\n",
    "temp = 0.0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {
    "uuid": "1ed09d3f-24a5-4936-b64c-a205182b5910"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 666 ms, sys: 65 ms, total: 731 ms\n",
      "Wall time: 738 ms\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "query = 'SELECT * FROM numbers WHERE No1 > 0 AND No2 < 0'\n",
    "res = np.array(con.execute(query).fetchall()).round(3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {
    "uuid": "d3100151-5563-48ca-8ba6-cc9a623d03cc"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(-4.5, 0.5)"
      ]
     },
     "execution_count": 77,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\nx8IAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x107b49668>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "res = res[::100]  # every 100th result\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "plt.plot(res[:, 0], res[:, 1], 'ro')\n",
    "plt.grid(True); plt.xlim(-0.5, 4.5); plt.ylim(-4.5, 0.5)\n",
    "# tag: scatter_query\n",
    "# title: Plot of the query result\n",
    "# size: 60"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### From SQL to pandas"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {
    "uuid": "d446ef85-a7d0-4aba-8b93-d2d60a1aee9b"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 1.94 s, sys: 203 ms, total: 2.15 s\n",
      "Wall time: 2.16 s\n"
     ]
    }
   ],
   "source": [
    "%time data = pd.read_sql('SELECT * FROM numbers', con)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "metadata": {
    "uuid": "052c40c0-6bb7-4084-9e84-da330dca43db"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>No1</th>\n",
       "      <th>No2</th>\n",
       "      <th>No3</th>\n",
       "      <th>No4</th>\n",
       "      <th>No5</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.81395</td>\n",
       "      <td>-1.14852</td>\n",
       "      <td>1.25441</td>\n",
       "      <td>-0.20772</td>\n",
       "      <td>-0.76249</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-1.75186</td>\n",
       "      <td>-0.51531</td>\n",
       "      <td>0.71860</td>\n",
       "      <td>0.45964</td>\n",
       "      <td>-0.61147</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.36132</td>\n",
       "      <td>1.14465</td>\n",
       "      <td>-1.54464</td>\n",
       "      <td>0.35145</td>\n",
       "      <td>-1.21890</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>-0.53355</td>\n",
       "      <td>-1.02722</td>\n",
       "      <td>-0.41101</td>\n",
       "      <td>1.62077</td>\n",
       "      <td>-0.34930</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.71410</td>\n",
       "      <td>0.62260</td>\n",
       "      <td>-0.55907</td>\n",
       "      <td>0.02055</td>\n",
       "      <td>-1.35438</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       No1      No2      No3      No4      No5\n",
       "0  0.81395 -1.14852  1.25441 -0.20772 -0.76249\n",
       "1 -1.75186 -0.51531  0.71860  0.45964 -0.61147\n",
       "2  0.36132  1.14465 -1.54464  0.35145 -1.21890\n",
       "3 -0.53355 -1.02722 -0.41101  1.62077 -0.34930\n",
       "4  0.71410  0.62260 -0.55907  0.02055 -1.35438"
      ]
     },
     "execution_count": 79,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "metadata": {
    "uuid": "a5f5d023-dfbb-4b54-a622-38a48b3d00a1"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 19.8 ms, sys: 11.5 ms, total: 31.4 ms\n",
      "Wall time: 30.5 ms\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>No1</th>\n",
       "      <th>No2</th>\n",
       "      <th>No3</th>\n",
       "      <th>No4</th>\n",
       "      <th>No5</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.81395</td>\n",
       "      <td>-1.14852</td>\n",
       "      <td>1.25441</td>\n",
       "      <td>-0.20772</td>\n",
       "      <td>-0.76249</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>0.67082</td>\n",
       "      <td>-0.82088</td>\n",
       "      <td>-0.49540</td>\n",
       "      <td>0.90000</td>\n",
       "      <td>-0.26839</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>0.44444</td>\n",
       "      <td>-1.53277</td>\n",
       "      <td>0.24012</td>\n",
       "      <td>1.14207</td>\n",
       "      <td>-1.31815</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20</th>\n",
       "      <td>0.60405</td>\n",
       "      <td>-1.65918</td>\n",
       "      <td>-1.18458</td>\n",
       "      <td>-0.62727</td>\n",
       "      <td>0.52210</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>23</th>\n",
       "      <td>0.40057</td>\n",
       "      <td>-1.35948</td>\n",
       "      <td>0.57998</td>\n",
       "      <td>-0.20918</td>\n",
       "      <td>0.59911</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        No1      No2      No3      No4      No5\n",
       "0   0.81395 -1.14852  1.25441 -0.20772 -0.76249\n",
       "15  0.67082 -0.82088 -0.49540  0.90000 -0.26839\n",
       "18  0.44444 -1.53277  0.24012  1.14207 -1.31815\n",
       "20  0.60405 -1.65918 -1.18458 -0.62727  0.52210\n",
       "23  0.40057 -1.35948  0.57998 -0.20918  0.59911"
      ]
     },
     "execution_count": 80,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%time data[(data['No1'] > 0) & (data['No2'] < 0)].head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "metadata": {
    "uuid": "2aa6d1e0-e157-4d5b-8a43-3fc696679511"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 26.6 ms, sys: 13 ms, total: 39.6 ms\n",
      "Wall time: 36.9 ms\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "res = data[['No1', 'No2']][((data['No1'] > 0.5) | (data['No1'] < -0.5))\n",
    "                     & ((data['No2'] < -1) | (data['No2'] > 1))]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "metadata": {
    "uuid": "d46cc119-c34b-4d3f-becd-f625c1a70f78"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(-4.8328180000000005,\n",
       " 5.1025580000000001,\n",
       " -5.0094565000000006,\n",
       " 5.1164065000000001)"
      ]
     },
     "execution_count": 82,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\ndZLO61S/AAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x10c59d5c0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(res.No1, res.No2, 'ro')\n",
    "plt.grid(True); plt.axis('tight')\n",
    "# tag: data_scatter_1\n",
    "# title: Scatter plot of complex query results\n",
    "# size: 55"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 83,
   "metadata": {
    "uuid": "7017f5f6-2a19-4d1e-b256-4936081ab91a"
   },
   "outputs": [],
   "source": [
    "h5s = pd.HDFStore(filename + '.h5s', 'w')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "metadata": {
    "uuid": "eec6ad05-c74e-49e9-bd35-965d56ba3bc9"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 43 ms, sys: 67.4 ms, total: 110 ms\n",
      "Wall time: 111 ms\n"
     ]
    }
   ],
   "source": [
    "%time h5s['data'] = data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 85,
   "metadata": {
    "uuid": "69057178-872b-4080-8d36-3ea1d9b56b18"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<class 'pandas.io.pytables.HDFStore'>\n",
       "File path: /Users/yves/Documents/Temp/data/numbs.h5s"
      ]
     },
     "execution_count": 85,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "h5s"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "metadata": {
    "uuid": "179c2cf9-9505-4e1a-b6fc-f71429bbfd6d"
   },
   "outputs": [],
   "source": [
    "h5s.close()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 87,
   "metadata": {
    "uuid": "f13d24ff-afa4-453c-b098-ce986f0ec341"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 8.49 ms, sys: 27.1 ms, total: 35.6 ms\n",
      "Wall time: 34.2 ms\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "h5s = pd.HDFStore(filename + '.h5s', 'r')\n",
    "temp = h5s['data']\n",
    "h5s.close()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 88,
   "metadata": {
    "uuid": "96b612da-9d26-498d-9b79-716d0bc9c5fa"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 88,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.allclose(np.array(temp), np.array(data))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 89,
   "metadata": {
    "uuid": "1e46b72f-22e2-4cc1-84a9-3c238f47c128"
   },
   "outputs": [],
   "source": [
    "temp = 0.0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 90,
   "metadata": {
    "uuid": "8d68e5ac-7434-4e1c-b5b8-0c6f03171826"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-rw-r--r--  1 yves  staff  52633600 Nov 18 11:19 /Users/yves/Documents/Temp/data/numbs.db\r\n",
      "-rw-r--r--  1 yves  staff  48007192 Nov 18 11:19 /Users/yves/Documents/Temp/data/numbs.h5s\r\n"
     ]
    }
   ],
   "source": [
    "ll $path*"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Data as CSV File"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 91,
   "metadata": {
    "uuid": "7925d095-cbde-430b-b2ef-f0f143df15b8"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 7.11 s, sys: 334 ms, total: 7.44 s\n",
      "Wall time: 7.7 s\n"
     ]
    }
   ],
   "source": [
    "%time data.to_csv(filename + '.csv')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 92,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "total 291944\r\n",
      "-rw-r--r--  1 yves  staff  48832354 Nov 18 11:19 numbs.csv\r\n",
      "-rw-r--r--  1 yves  staff  52633600 Nov 18 11:19 numbs.db\r\n",
      "-rw-r--r--  1 yves  staff  48007192 Nov 18 11:19 numbs.h5s\r\n"
     ]
    }
   ],
   "source": [
    "ll $path"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 93,
   "metadata": {
    "uuid": "074e493b-576f-4a3d-a9b5-cafd2045c75c"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 2.03 s, sys: 222 ms, total: 2.26 s\n",
      "Wall time: 2.64 s\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([[<matplotlib.axes._subplots.AxesSubplot object at 0x107cf9198>,\n",
       "        <matplotlib.axes._subplots.AxesSubplot object at 0x1066c7a20>],\n",
       "       [<matplotlib.axes._subplots.AxesSubplot object at 0x101e7d0f0>,\n",
       "        <matplotlib.axes._subplots.AxesSubplot object at 0x101eb4710>]], dtype=object)"
      ]
     },
     "execution_count": 93,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\nZn+2UWFEXNak/MekJFBX/hbF/bpG69xEcZnWrCe09MJd6oYfQtEN307SXDZ2nWHzbvjctF65G/48\nqRveYJ07S+u81w0H7gb2qX3RNC1z19h308zMxquVp572wd1wM7OB1crN7McAd8PNzAaUv/VkZmZZ\nThRmZpY1sJ/wGAS5x2DNqsgx3xnuUZiZWZYThZmZZTlRmJlZlhOFmZll+Wa2mQ00f/tsdO5RmJlZ\nlnsUtgmfXZlZPfcozMwsy4nCzMyynCjMzCzLicLMzLKcKMzMLMuJwszMspwozMwsy4nCzMyynCjM\nzCzLicLMzLKcKMzMLMuJwszMspwozMwsy4nCzMyynCjMzCzL41GYWV/JjZlineFE0efcaMys03zp\nyczMspwozMwsy4nCzMyynCjMzCzLN7PNzJpo9rDIDWcdNMk16S73KMzMLMuJwszMspwozMwsy/co\nrGWDdL1W0nbAhcCeEbFvKtsKuBz4JbArsCQink3zjgT2BjYAP4+I61L5TsC5wHPATsCXIuJNSe8D\nFgNvAjsCSyPikbTOwcDhwEpgJCIumIx9NmvGPQqzxvYH7gCmlMpOBV6KiIuBK4GlAJK2BxYCCyPi\nDOAESbumda4Frkvr/AQ4M5UfAcyKiAtT2TclTZU0I61zWkScD3xI0vwO7qfZqEbtUfjMygZRRNwm\naV5d8QLg7DT/SUl7SpoFHAI8FhEjabmHgU9IWgEcCDyayh8CrqdoBwuAe9K2XpP0NrAHMAS8GBHr\nSussAH7Y7n00a1Url55qZ1Z7lcpqZ1aXSppDcWZ1QOnMau+IGJH0qKRlEfEzirOkRRGxXNIpFGdR\n57LxzOosSVsDj0jaHdgyrbNHRKyTdLuk+RHhBmPdsi2wpjS9OpU1K98GeKuUQGrluW0NNSnPmj17\nBtOmTc0uMzQ0c7TNWIuqdCxb2ZdRE4XPrMzesxIot6pZqWwlsEtd+XPAq8B0SVNSm6gtn9vWSJPy\nrFWr1mbnDw3NZHh4TXYZa11VjmU5LnIJY7w3s3v2zApaO7uCap0VdFMVjmOL+3AnMBd4MPWkH4+I\n1ZLuBk4pJYS5wDURsV7SfcC+wHJgv7SN2rY+CtyYetJbAU9R9KR3lLRlOknaD/ibtu2o2TiMN1H0\n7JkVjH52BT7Daqd+P46NYmH//T/8MeAo4AOSzgGuAK4CLk/TuwDHA0TEy5IuB66UtAG4Pl1uBTgR\nWCTpfwA7AKen8luBvSWdl8qPjogNwFpJJwFXSxoGnvDlVuu28SYKn1lZpUXE/cD9DWZ9ocnyNwE3\nNShfARzXoPxdNj4BVT/vXuDeMVTXrKNaeerJZ1ZmZgOslZvZPrMyMxtgfuHOzMyynCjMzCzLicLM\nzLKcKMzMLMuJwszMspwozMwsy+NRmFlPajb+iU0+J4o+4UZjZt3iS09mZpblRGFmZllOFGZmluV7\nFGZmY5S7Z3jDWQdNYk0mh3sUZmaW5URhZmZZvvRkEzZo3XCzQeMehZmZZTlRmJlZlhOFmZllOVGY\nmVmWE4WZmWU5UZiZWZYThZmZZTlRmJlZlhOFmZllOVGYmVmWP+HRQzyKnQ0ax3x/cI/CzMyy3KMw\nM2ujKn4k0z0KMzPLcqIwM7MsX3qyjmrWDe/XLrjZIHKPwszMspwozMwsy4nCzMyyfI/CzDrOL9b1\nNyeKSeYGY2b9xonCzGyS9OtTgH2RKCQdDBwOrARGIuKCLlfJJqiKb6+2k2PeeknPJwpJM4BrgT0i\nYp2k2yXNj4gfdrtuOb7EZOPlmLde0/OJApgLvBgR69L0Q8ACoKcbjY2fexu9G/NOBp3R6zHfD4li\nW2BNaXp1KmtqaGjmlFY2PDQ0cwLVyvuXKz7VsW1b+3UyFsahIzHfjn10XFdPK3HRD+9RrATKezIr\nlZlVlWPeeko/JIqHgR0lbZmm9wPu7GJ9zDrNMW89ZcrIyEi36zAqSR8HPg0MA+v9BIhVnWPeeklf\nJAozM+uefrj0ZGZmXeREYWZmWU4UZmaW1Q/vUXSMpPOBeaWiiyLi3u7UZnL5ExEFSY8Ab6fJDREx\nv5v16aRBjvcax/1GY4n9gU4UABExr9t1mGz9+omIDvl+RJzf7UpMlkGM9xrH/WZajv2BTxSSvgKs\nA6YC10TE2i5XaTL07CciumCOpDOB6cCjEVHp9xUGNN5rHPebajn2K58oJN0N/HaDWYuAbwMrIuI3\nkj4PXAMcP5n165IxfyKiwi6JiOWSpgIPSFoTEQ90u1Lj5XjPctxvquXYr3yiiIhDWlx0GfDlTtal\nh/gTEUlELE9/b5D0IHAg0LeJwvGe5bgvGUvsD/RTT5IuK03uCjzXrbpMMn8iApC0m6TyGXWlY2CA\n473GcZ+MNfYr36MYxTuSrqI4q5gDfKHL9ZkUEbFW0knA1ZKGgScG9IbeauBQSR+kOLv8BfCt7lap\nowYy3msc95sYU+z7Ex5mZpY10JeezMxsdE4UZmaW5URhZmZZThRmZpblRGFmZllOFGZmluVEYWZm\nWf8f0yOGydq3uIYAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x107cefb38>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%%time\n",
    "pd.read_csv(filename + '.csv')[['No1', 'No2',\n",
    "                                'No3', 'No4']].hist(bins=20);\n",
    "# tag: data_hist_3\n",
    "# title: Histogram of 4 data set"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Data as Excel File"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 94,
   "metadata": {
    "uuid": "735350dc-e6af-4ee7-8f27-2505b3454682"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 26.4 s, sys: 613 ms, total: 27.1 s\n",
      "Wall time: 27.7 s\n"
     ]
    }
   ],
   "source": [
    "%time data[:100000].to_excel(filename + '.xlsx')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 95,
   "metadata": {
    "uuid": "0d2365b9-28b2-4bb5-8515-4c9ca628ec00"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 5.78 s, sys: 90.6 ms, total: 5.87 s\n",
      "Wall time: 5.9 s\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x10668f748>"
      ]
     },
     "execution_count": 95,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x107fc1518>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%time pd.read_excel(filename + '.xlsx', 'Sheet1').cumsum().plot()\n",
    "# tag: data_paths\n",
    "# title: Paths of random data from Excel file\n",
    "# size: 60"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 96,
   "metadata": {
    "uuid": "0f0f0a19-994c-43ff-940f-9cd05b94a0cd"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-rw-r--r--  1 yves  staff  48832354 Nov 18 11:19 /Users/yves/Documents/Temp/data/numbs.csv\r\n",
      "-rw-r--r--  1 yves  staff  52633600 Nov 18 11:19 /Users/yves/Documents/Temp/data/numbs.db\r\n",
      "-rw-r--r--  1 yves  staff  48007192 Nov 18 11:19 /Users/yves/Documents/Temp/data/numbs.h5s\r\n",
      "-rw-r--r--  1 yves  staff   4370554 Nov 18 11:19 /Users/yves/Documents/Temp/data/numbs.xlsx\r\n"
     ]
    }
   ],
   "source": [
    "ll $path*"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 97,
   "metadata": {
    "uuid": "638a2e35-0a12-41be-9743-c7f4f4afcb23"
   },
   "outputs": [],
   "source": [
    "rm -f $path*"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Fast I/O with PyTables"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 98,
   "metadata": {
    "uuid": "b671c317-5247-4a6b-94c9-0ee2850decba"
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import tables as tb\n",
    "import datetime as dt\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Working with Tables"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 99,
   "metadata": {
    "uuid": "4f7391d1-2f86-4913-af4d-2c603c970605"
   },
   "outputs": [],
   "source": [
    "filename = path + 'tab.h5'\n",
    "h5 = tb.open_file(filename, 'w') "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 100,
   "metadata": {
    "uuid": "28c4dabe-bfbe-4a90-bd60-072c2e8f1aa1"
   },
   "outputs": [],
   "source": [
    "rows = 2000000"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 101,
   "metadata": {
    "uuid": "60a374d2-b78c-4473-b17a-69982fd27a4c"
   },
   "outputs": [],
   "source": [
    "row_des = {\n",
    "    'Date': tb.StringCol(26, pos=1),\n",
    "    'No1': tb.IntCol(pos=2),\n",
    "    'No2': tb.IntCol(pos=3),\n",
    "    'No3': tb.Float64Col(pos=4),\n",
    "    'No4': tb.Float64Col(pos=5)\n",
    "    }"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 102,
   "metadata": {
    "uuid": "027696b8-2e1b-489f-8cb6-c24c6c3702ee"
   },
   "outputs": [],
   "source": [
    "filters = tb.Filters(complevel=0)  # no compression\n",
    "tab = h5.create_table('/', 'ints_floats', row_des,\n",
    "                      title='Integers and Floats',\n",
    "                      expectedrows=rows, filters=filters)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 103,
   "metadata": {
    "uuid": "71ce6940-bde4-437f-9daa-f2f577f3cd7e"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "/ints_floats (Table(0,)) 'Integers and Floats'\n",
       "  description := {\n",
       "  \"Date\": StringCol(itemsize=26, shape=(), dflt=b'', pos=0),\n",
       "  \"No1\": Int32Col(shape=(), dflt=0, pos=1),\n",
       "  \"No2\": Int32Col(shape=(), dflt=0, pos=2),\n",
       "  \"No3\": Float64Col(shape=(), dflt=0.0, pos=3),\n",
       "  \"No4\": Float64Col(shape=(), dflt=0.0, pos=4)}\n",
       "  byteorder := 'little'\n",
       "  chunkshape := (2621,)"
      ]
     },
     "execution_count": 103,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tab"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 104,
   "metadata": {
    "uuid": "3830afd0-0a7b-439a-81b2-c81194deb7a5"
   },
   "outputs": [],
   "source": [
    "pointer = tab.row"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 105,
   "metadata": {
    "uuid": "493096c9-7a8e-4342-b7c3-9390cbc03c6b"
   },
   "outputs": [],
   "source": [
    "ran_int = np.random.randint(0, 10000, size=(rows, 2))\n",
    "ran_flo = np.random.standard_normal((rows, 2)).round(5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 106,
   "metadata": {
    "uuid": "a15c64b5-17f2-4e11-b051-a6d68ba4bf7f"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 7.61 s, sys: 90.9 ms, total: 7.7 s\n",
      "Wall time: 7.73 s\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "for i in range(rows):\n",
    "    pointer['Date'] = dt.datetime.now()\n",
    "    pointer['No1'] = ran_int[i, 0]\n",
    "    pointer['No2'] = ran_int[i, 1] \n",
    "    pointer['No3'] = ran_flo[i, 0]\n",
    "    pointer['No4'] = ran_flo[i, 1] \n",
    "    pointer.append()\n",
    "      # this appends the data and\n",
    "      # moves the pointer one row forward\n",
    "tab.flush()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 107,
   "metadata": {
    "uuid": "0d0739a9-79a3-410a-abf0-20f6b8cef8c5"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "/ints_floats (Table(2000000,)) 'Integers and Floats'\n",
       "  description := {\n",
       "  \"Date\": StringCol(itemsize=26, shape=(), dflt=b'', pos=0),\n",
       "  \"No1\": Int32Col(shape=(), dflt=0, pos=1),\n",
       "  \"No2\": Int32Col(shape=(), dflt=0, pos=2),\n",
       "  \"No3\": Float64Col(shape=(), dflt=0.0, pos=3),\n",
       "  \"No4\": Float64Col(shape=(), dflt=0.0, pos=4)}\n",
       "  byteorder := 'little'\n",
       "  chunkshape := (2621,)"
      ]
     },
     "execution_count": 107,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tab"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 108,
   "metadata": {
    "uuid": "cff18aaa-9959-41a9-8f05-8ba42192368c"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-rw-r--r--  1 yves  staff  100156248 Nov 18 11:20 /Users/yves/Documents/Temp/data/tab.h5\r\n"
     ]
    }
   ],
   "source": [
    "ll $path*"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 109,
   "metadata": {
    "uuid": "2b81e6f0-86a1-429f-8d7c-ac4bbdcdd616"
   },
   "outputs": [],
   "source": [
    "dty = np.dtype([('Date', 'S26'), ('No1', '<i4'), ('No2', '<i4'),\n",
    "                                 ('No3', '<f8'), ('No4', '<f8')])\n",
    "sarray = np.zeros(len(ran_int), dtype=dty)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 110,
   "metadata": {
    "uuid": "15ef6c1c-c760-4bdd-9e1b-fe46c108abf8"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([(b'', 0, 0,  0.,  0.), (b'', 0, 0,  0.,  0.), (b'', 0, 0,  0.,  0.),\n",
       "       ..., (b'', 0, 0,  0.,  0.), (b'', 0, 0,  0.,  0.),\n",
       "       (b'', 0, 0,  0.,  0.)],\n",
       "      dtype=[('Date', 'S26'), ('No1', '<i4'), ('No2', '<i4'), ('No3', '<f8'), ('No4', '<f8')])"
      ]
     },
     "execution_count": 110,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sarray"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 111,
   "metadata": {
    "uuid": "87071ae4-4ff2-402e-8746-037fee04b07c"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 83.6 ms, sys: 43.1 ms, total: 127 ms\n",
      "Wall time: 126 ms\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "sarray['Date'] = dt.datetime.now()\n",
    "sarray['No1'] = ran_int[:, 0]\n",
    "sarray['No2'] = ran_int[:, 1]\n",
    "sarray['No3'] = ran_flo[:, 0]\n",
    "sarray['No4'] = ran_flo[:, 1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 112,
   "metadata": {
    "uuid": "992c3894-7eb7-4699-9e6b-2a6fb4e6eabf"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 31.9 ms, sys: 53.7 ms, total: 85.6 ms\n",
      "Wall time: 86.3 ms\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "/ints_floats_from_array (Table(2000000,)) 'Integers and Floats'\n",
       "  description := {\n",
       "  \"Date\": StringCol(itemsize=26, shape=(), dflt=b'', pos=0),\n",
       "  \"No1\": Int32Col(shape=(), dflt=0, pos=1),\n",
       "  \"No2\": Int32Col(shape=(), dflt=0, pos=2),\n",
       "  \"No3\": Float64Col(shape=(), dflt=0.0, pos=3),\n",
       "  \"No4\": Float64Col(shape=(), dflt=0.0, pos=4)}\n",
       "  byteorder := 'little'\n",
       "  chunkshape := (2621,)"
      ]
     },
     "execution_count": 112,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%%time\n",
    "h5.create_table('/', 'ints_floats_from_array', sarray,\n",
    "                      title='Integers and Floats',\n",
    "                      expectedrows=rows, filters=filters)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 113,
   "metadata": {
    "uuid": "a7616365-19cf-4cbb-a6a0-01c3b88cb457"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "File(filename=/Users/yves/Documents/Temp/data/tab.h5, title='', mode='w', root_uep='/', filters=Filters(complevel=0, shuffle=False, bitshuffle=False, fletcher32=False, least_significant_digit=None))\n",
       "/ (RootGroup) ''\n",
       "/ints_floats (Table(2000000,)) 'Integers and Floats'\n",
       "  description := {\n",
       "  \"Date\": StringCol(itemsize=26, shape=(), dflt=b'', pos=0),\n",
       "  \"No1\": Int32Col(shape=(), dflt=0, pos=1),\n",
       "  \"No2\": Int32Col(shape=(), dflt=0, pos=2),\n",
       "  \"No3\": Float64Col(shape=(), dflt=0.0, pos=3),\n",
       "  \"No4\": Float64Col(shape=(), dflt=0.0, pos=4)}\n",
       "  byteorder := 'little'\n",
       "  chunkshape := (2621,)\n",
       "/ints_floats_from_array (Table(2000000,)) 'Integers and Floats'\n",
       "  description := {\n",
       "  \"Date\": StringCol(itemsize=26, shape=(), dflt=b'', pos=0),\n",
       "  \"No1\": Int32Col(shape=(), dflt=0, pos=1),\n",
       "  \"No2\": Int32Col(shape=(), dflt=0, pos=2),\n",
       "  \"No3\": Float64Col(shape=(), dflt=0.0, pos=3),\n",
       "  \"No4\": Float64Col(shape=(), dflt=0.0, pos=4)}\n",
       "  byteorder := 'little'\n",
       "  chunkshape := (2621,)"
      ]
     },
     "execution_count": 113,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "h5"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 114,
   "metadata": {
    "uuid": "f498bb1c-ef46-4ee9-956d-21f292687323"
   },
   "outputs": [],
   "source": [
    "h5.remove_node('/', 'ints_floats_from_array')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 115,
   "metadata": {
    "uuid": "e99634bc-effd-43ee-ac2e-4b66b925433b"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([(b'2017-11-18 11:19:58.907369',  364, 9255, -0.8055 ,  0.1939 ),\n",
       "       (b'2017-11-18 11:19:58.907491', 3148, 7723,  0.02658,  0.13049),\n",
       "       (b'2017-11-18 11:19:58.907536', 3818,  883,  1.7987 , -0.1117 )],\n",
       "      dtype=[('Date', 'S26'), ('No1', '<i4'), ('No2', '<i4'), ('No3', '<f8'), ('No4', '<f8')])"
      ]
     },
     "execution_count": 115,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tab[:3]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 116,
   "metadata": {
    "uuid": "d84a41bd-36d3-4e11-8a4d-44440551a493"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 0.1939 ,  0.13049, -0.1117 , -0.81207])"
      ]
     },
     "execution_count": 116,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tab[:4]['No4']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 117,
   "metadata": {
    "uuid": "f7616601-4e98-42cc-9935-c855877d178c"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 52.9 ms, sys: 81.8 ms, total: 135 ms\n",
      "Wall time: 139 ms\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "-704.67624000000001"
      ]
     },
     "execution_count": 117,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%time np.sum(tab[:]['No3'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 118,
   "metadata": {
    "uuid": "9061ed32-44db-4c13-a44a-92b313b4af40"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 47.5 ms, sys: 62.7 ms, total: 110 ms\n",
      "Wall time: 115 ms\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "133331453.10578465"
      ]
     },
     "execution_count": 118,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%time np.sum(np.sqrt(tab[:]['No1']))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 119,
   "metadata": {
    "uuid": "558b4627-15f8-4a8f-8d5a-fc7213ee074e"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2000000\n",
      "CPU times: user 228 ms, sys: 130 ms, total: 359 ms\n",
      "Wall time: 399 ms\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1569de470>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%%time\n",
    "plt.hist(tab[:]['No3'], bins=30)\n",
    "plt.grid(True)\n",
    "print(len(tab[:]['No3']))\n",
    "# tag: data_hist\n",
    "# title: Histogram of data\n",
    "# size: 60"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 120,
   "metadata": {
    "uuid": "62ea755e-493b-4230-96ad-0ce7a0a33acc"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 392 ms, sys: 92.2 ms, total: 484 ms\n",
      "Wall time: 469 ms\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "res = np.array([(row['No3'], row['No4']) for row in\n",
    "        tab.where('((No3 < -0.5) | (No3 > 0.5)) \\\n",
    "                 & ((No4 < -1) | (No4 > 1))')])[::100]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 121,
   "metadata": {
    "uuid": "705d91ca-dc94-4db1-84d7-164fb5f5f1af"
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\nD+Fs4TNnWHfSAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x128ddb5f8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(res.T[0], res.T[1], 'ro')\n",
    "plt.grid(True)\n",
    "# tag: scatter_data\n",
    "# title: Scatter plot of query result\n",
    "# size: 70"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 122,
   "metadata": {
    "uuid": "a9e8e16c-9af5-48dc-bf5c-39b353f5c09b"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Max              5.167\n",
      "Ave             -0.000\n",
      "Min             -4.692\n",
      "Std              1.000\n",
      "CPU times: user 52.1 ms, sys: 50.7 ms, total: 103 ms\n",
      "Wall time: 99.3 ms\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "values = tab.cols.No3[:]\n",
    "print(\"Max %18.3f\" % values.max())\n",
    "print(\"Ave %18.3f\" % values.mean())\n",
    "print(\"Min %18.3f\" % values.min())\n",
    "print(\"Std %18.3f\" % values.std())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 123,
   "metadata": {
    "uuid": "6cfb0992-c393-45b0-999b-b242ea9c1ce6"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(9888, 4583)\n",
      "(85, 5058)\n",
      "(9963, 4937)\n",
      "(9821, 5035)\n",
      "CPU times: user 92.3 ms, sys: 41.1 ms, total: 133 ms\n",
      "Wall time: 102 ms\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "results = [(row['No1'], row['No2']) for row in\n",
    "           tab.where('((No1 > 9800) | (No1 < 200)) \\\n",
    "                    & ((No2 > 4500) & (No2 < 5500))')]\n",
    "for res in results[:4]:\n",
    "    print(res)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 124,
   "metadata": {
    "uuid": "399c76db-4f79-4264-b25f-50eab32303e0"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(1234, 9855)\n",
      "(1234, 9854)\n",
      "(1234, 9960)\n",
      "(1234, 9910)\n",
      "(1234, 9980)\n",
      "CPU times: user 56.8 ms, sys: 44.2 ms, total: 101 ms\n",
      "Wall time: 86.7 ms\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "results = [(row['No1'], row['No2']) for row in\n",
    "           tab.where('(No1 == 1234) & (No2 > 9776)')]\n",
    "for res in results:\n",
    "    print(res)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Working with Compressed Tables"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 125,
   "metadata": {
    "uuid": "4e6ac124-2500-47c5-9478-2eaaba25ea00"
   },
   "outputs": [],
   "source": [
    "filename = path + 'tab.h5c'\n",
    "h5c = tb.open_file(filename, 'w') "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 126,
   "metadata": {
    "uuid": "830338b0-ec10-4f95-8058-62b1858b46b7"
   },
   "outputs": [],
   "source": [
    "filters = tb.Filters(complevel=4, complib='blosc')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 127,
   "metadata": {
    "uuid": "d11f1cdc-c54a-49f3-992d-b76f7cad5a4a"
   },
   "outputs": [],
   "source": [
    "tabc = h5c.create_table('/', 'ints_floats', sarray,\n",
    "                        title='Integers and Floats',\n",
    "                      expectedrows=rows, filters=filters)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 128,
   "metadata": {
    "uuid": "a173ee6b-7dc3-4071-b995-842a46c46e97"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 364 ms, sys: 70 ms, total: 434 ms\n",
      "Wall time: 393 ms\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "res = np.array([(row['No3'], row['No4']) for row in\n",
    "             tabc.where('((No3 < -0.5) | (No3 > 0.5)) \\\n",
    "                       & ((No4 < -1) | (No4 > 1))')])[::100]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 129,
   "metadata": {
    "uuid": "f4e1df40-c747-49a2-815c-f1cbd33f621d"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 36.9 ms, sys: 59.9 ms, total: 96.8 ms\n",
      "Wall time: 99.5 ms\n"
     ]
    }
   ],
   "source": [
    "%time arr_non = tab.read()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 130,
   "metadata": {
    "uuid": "f7428798-5946-49be-88b1-d67d26a41e70"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 42.2 ms, sys: 70.6 ms, total: 113 ms\n",
      "Wall time: 132 ms\n"
     ]
    }
   ],
   "source": [
    "%time arr_com = tabc.read()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 131,
   "metadata": {
    "uuid": "e21f417f-f123-41b5-b26b-ecebbbaa5c85"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-rw-r--r--  1 yves  staff  200312336 Nov 18 11:20 /Users/yves/Documents/Temp/data/tab.h5\r\n",
      "-rw-r--r--  1 yves  staff  100030837 Nov 18 11:20 /Users/yves/Documents/Temp/data/tab.h5c\r\n"
     ]
    }
   ],
   "source": [
    "ll $path*"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 132,
   "metadata": {
    "uuid": "ea7dd80f-44d8-4cd9-a16f-308a302dd460"
   },
   "outputs": [],
   "source": [
    "h5c.close()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Working with Arrays"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 133,
   "metadata": {
    "uuid": "ee67fc74-5820-4037-b8d9-281c74435160"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 2.07 ms, sys: 29.4 ms, total: 31.4 ms\n",
      "Wall time: 31.4 ms\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "arr_int = h5.create_array('/', 'integers', ran_int)\n",
    "arr_flo = h5.create_array('/', 'floats', ran_flo)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 134,
   "metadata": {
    "uuid": "c91c089b-4727-4928-8069-2f74ab1f2c61"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "File(filename=/Users/yves/Documents/Temp/data/tab.h5, title='', mode='w', root_uep='/', filters=Filters(complevel=0, shuffle=False, bitshuffle=False, fletcher32=False, least_significant_digit=None))\n",
       "/ (RootGroup) ''\n",
       "/floats (Array(2000000, 2)) ''\n",
       "  atom := Float64Atom(shape=(), dflt=0.0)\n",
       "  maindim := 0\n",
       "  flavor := 'numpy'\n",
       "  byteorder := 'little'\n",
       "  chunkshape := None\n",
       "/integers (Array(2000000, 2)) ''\n",
       "  atom := Int64Atom(shape=(), dflt=0)\n",
       "  maindim := 0\n",
       "  flavor := 'numpy'\n",
       "  byteorder := 'little'\n",
       "  chunkshape := None\n",
       "/ints_floats (Table(2000000,)) 'Integers and Floats'\n",
       "  description := {\n",
       "  \"Date\": StringCol(itemsize=26, shape=(), dflt=b'', pos=0),\n",
       "  \"No1\": Int32Col(shape=(), dflt=0, pos=1),\n",
       "  \"No2\": Int32Col(shape=(), dflt=0, pos=2),\n",
       "  \"No3\": Float64Col(shape=(), dflt=0.0, pos=3),\n",
       "  \"No4\": Float64Col(shape=(), dflt=0.0, pos=4)}\n",
       "  byteorder := 'little'\n",
       "  chunkshape := (2621,)"
      ]
     },
     "execution_count": 134,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "h5"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 135,
   "metadata": {
    "uuid": "5bf3d20c-0dd1-447f-b7ca-34adb0e9a2c6"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-rw-r--r--  1 yves  staff  262344490 Nov 18 11:20 /Users/yves/Documents/Temp/data/tab.h5\r\n",
      "-rw-r--r--  1 yves  staff  100030837 Nov 18 11:20 /Users/yves/Documents/Temp/data/tab.h5c\r\n"
     ]
    }
   ],
   "source": [
    "ll $path*"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 136,
   "metadata": {
    "uuid": "3dfffbc8-ab8e-4c6e-9e18-316d220e51a0"
   },
   "outputs": [],
   "source": [
    "h5.close()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 137,
   "metadata": {
    "uuid": "2a157cb2-dcc1-44fe-b4da-658bbe2b6ebb"
   },
   "outputs": [],
   "source": [
    "!rm -f $path*"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Out-of-Memory Computations"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 138,
   "metadata": {
    "uuid": "e241b3b2-bfe1-45b4-9e85-0b39586ca42a"
   },
   "outputs": [],
   "source": [
    "filename = path + 'array.h5'\n",
    "h5 = tb.open_file(filename, 'w') "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 139,
   "metadata": {
    "uuid": "dd0e24b0-d0cc-4cb0-90e0-7c6445dcb1d2"
   },
   "outputs": [],
   "source": [
    "n = 100\n",
    "ear = h5.create_earray(h5.root, 'ear',\n",
    "                      atom=tb.Float64Atom(),\n",
    "                      shape=(0, n))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 140,
   "metadata": {
    "uuid": "4dabef84-39ca-4dd4-a8ab-edc65d340965"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 58.9 ms, sys: 46.3 ms, total: 105 ms\n",
      "Wall time: 110 ms\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "rand = np.random.standard_normal((n, n))\n",
    "for i in range(750):\n",
    "    ear.append(rand)\n",
    "ear.flush()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 141,
   "metadata": {
    "uuid": "4dd0218f-b9ca-4ee5-8a1f-af071e346c55"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "/ear (EArray(75000, 100)) ''\n",
       "  atom := Float64Atom(shape=(), dflt=0.0)\n",
       "  maindim := 0\n",
       "  flavor := 'numpy'\n",
       "  byteorder := 'little'\n",
       "  chunkshape := (81, 100)"
      ]
     },
     "execution_count": 141,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ear"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 142,
   "metadata": {
    "uuid": "58694407-5d44-400d-99a1-252ea1595514"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "60004800"
      ]
     },
     "execution_count": 142,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ear.size_on_disk"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 143,
   "metadata": {
    "uuid": "f29bef2e-37fb-4f47-83fd-ef09041f2f77"
   },
   "outputs": [],
   "source": [
    "out = h5.create_earray(h5.root, 'out',\n",
    "                      atom=tb.Float64Atom(),\n",
    "                      shape=(0, n))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 144,
   "metadata": {
    "uuid": "aedc7c36-5839-4df5-8391-f0620b2c1381"
   },
   "outputs": [],
   "source": [
    "expr = tb.Expr('3 * sin(ear) + sqrt(abs(ear))')\n",
    "  # the numerical expression as a string object\n",
    "expr.set_output(out, append_mode=True)\n",
    "  # target to store results is disk-based array"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 145,
   "metadata": {
    "uuid": "79542d3f-60fe-4303-abb8-2a21ce9512f2"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 126 ms, sys: 60.3 ms, total: 186 ms\n",
      "Wall time: 143 ms\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "/out (EArray(75000, 100)) ''\n",
       "  atom := Float64Atom(shape=(), dflt=0.0)\n",
       "  maindim := 0\n",
       "  flavor := 'numpy'\n",
       "  byteorder := 'little'\n",
       "  chunkshape := (81, 100)"
      ]
     },
     "execution_count": 145,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%time expr.eval()\n",
    "  # evaluation of the numerical expression\n",
    "  # and storage of results in disk-based array"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 146,
   "metadata": {
    "uuid": "19d61e69-3488-4556-8d2b-cc06edb9c39e"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-1.07467344, -1.37566913,  0.58400115, -1.24829058,  3.21885945,\n",
       "        3.91948805,  4.24386819,  2.68949685,  4.25101978,  3.45909167])"
      ]
     },
     "execution_count": 146,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "out[0, :10]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 147,
   "metadata": {
    "uuid": "2409ddc9-2963-4599-9d8c-a3abc1e010d3"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 29.9 ms, sys: 44.2 ms, total: 74.2 ms\n",
      "Wall time: 83.9 ms\n"
     ]
    }
   ],
   "source": [
    "%time imarray = ear.read()\n",
    "  # read whole array into memory"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 148,
   "metadata": {
    "uuid": "65d5272f-66d9-4fdd-a16a-ae900f2842c4"
   },
   "outputs": [],
   "source": [
    "import numexpr as ne\n",
    "expr = '3 * sin(imarray) + sqrt(abs(imarray))'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 149,
   "metadata": {
    "uuid": "d58a70be-dc0f-444f-895d-9115864059c8"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 94 ms, sys: 48.1 ms, total: 142 ms\n",
      "Wall time: 40.1 ms\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([-1.07467344, -1.37566913,  0.58400115, -1.24829058,  3.21885945,\n",
       "        3.91948805,  4.24386819,  2.68949685,  4.25101978,  3.45909167])"
      ]
     },
     "execution_count": 149,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ne.set_num_threads(16)\n",
    "%time ne.evaluate(expr)[0, :10]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 150,
   "metadata": {
    "uuid": "d0c3ef43-f285-4dc1-b0ab-af206e6b3dd6"
   },
   "outputs": [],
   "source": [
    "h5.close()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 151,
   "metadata": {
    "uuid": "4343a20a-8132-4fbf-9360-3a627da7d0cf"
   },
   "outputs": [],
   "source": [
    "!rm -f $path*"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Conclusions"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Further Reading"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<img src=\"http://hilpisch.com/tpq_logo.png\" alt=\"The Python Quants\" width=\"35%\" align=\"right\" border=\"0\"><br>\n",
    "\n",
    "<a href=\"http://tpq.io\" target=\"_blank\">http://tpq.io</a> | <a href=\"http://twitter.com/dyjh\" target=\"_blank\">@dyjh</a> | <a href=\"mailto:training@tpq.io\">training@tpq.io</a>\n",
    "\n",
    "**Quant Platform** |\n",
    "<a href=\"http://quant-platform.com\">http://quant-platform.com</a>\n",
    "\n",
    "**Python for Finance** |\n",
    "<a href=\"http://python-for-finance.com\" target=\"_blank\">Python for Finance @ O'Reilly</a>\n",
    "\n",
    "**Derivatives Analytics with Python** |\n",
    "<a href=\"http://derivatives-analytics-with-python.com\" target=\"_blank\">Derivatives Analytics @ Wiley Finance</a>\n",
    "\n",
    "**Listed Volatility and Variance Derivatives** |\n",
    "<a href=\"http://lvvd.tpq.io\" target=\"_blank\">Listed VV Derivatives @ Wiley Finance</a>\n",
    "\n",
    "**Python Training** |\n",
    "<a href=\"http://training.tpq.io\" target=\"_blank\">Python for Finance University Certificate</a>"
   ]
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
